package java_thinking.unit_9._9_9;

/**
 * @Description : 工厂设计模式
 *                接口是实现多重继承的途径，而生成遵循某个接口对象的经典方式就是工厂方法设计模式
 *                通过这种方式，我们的代码将完全与接口的实现分离，这就使得我们可以透明地将某个实现替换为另一个实现
 *                工厂对象调用的是创建方法，该工厂的方法将生成接口的某个实现类的对象
 * @author: cww
 * @DateTime: 2019/3/6 9:04
 */
interface Service {
    void method1();
    void method2();
}

/**
 * 这是应用人员需要写的实际工厂里面的方法要实现哪些功能类
 */
class Implementation1 implements Service {

    Implementation1 (){}
    @Override
    public void method1() {
        System.out.println("Implementation1.method1");
    }

    @Override
    public void method2() {
        System.out.println("Implementation1.method2");
    }
}
/**
 * 1.工厂对象：接口对象创建方法
 */
interface ServiceFactory {
    Service getService();
}

/**
 * 工厂对象：生成接口的某个实现的对象
 * 这是应用人员创建上面自定义的功能类并返回
 */
class Implementation1Factory implements ServiceFactory {


    @Override
    public Service getService() {
        return new Implementation1();
    }
}

class Implementation2 implements Service {
    public Implementation2 (){}
    @Override
    public void method1() {
        System.out.println("Implementation2.method1");
    }

    @Override
    public void method2() {
        System.out.println("Implementation2.method2");
    }
}

class Implementation2Factory implements ServiceFactory {

    @Override
    public Service getService() {
        return new Implementation2();
    }
}

class Factories {
    public static void serviceConsumer(ServiceFactory factory){
        Service s = factory.getService();
        s.method1();
        s.method2();
    }

    public static void main(String[] args) {
        serviceConsumer(new Implementation1Factory());
        serviceConsumer(new Implementation2Factory());
    }
}